package visiopuce.ui;

import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.hibernate.HibernateException;

import visiopuce.objets.Analyse;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Resultat;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.ResultatServiceImpl;

public class EnvoyerCotationDialog extends Dialog {

	String titre;
	private Prelevement prel;
	private boolean envoyer = true;
	private List<Prelevement> prelevements;

	public EnvoyerCotationDialog(Shell parentShell, String titre, Prelevement prel) {
		super(parentShell);
		this.titre = titre;
		this.prel = prel;
		setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL);
		setBlockOnOpen(true);
	}

	@Override
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		shell.setText(titre);
	}

	@Override
	protected Control createDialogArea(Composite parent) {
		Composite container = (Composite) super.createDialogArea(parent);
		GridLayout layout = new GridLayout(1, false);
		layout.marginRight = 5;
		layout.marginLeft = 10;
		container.setLayout(layout);

		Label titrer = new Label(container, SWT.NONE);
		titrer.setText("Envoi pour le numéro de séjour : " + prel.getNumSejour());
		titrer.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));

		if (prel.getCotationEnvoye() == 0) {

			Label titre = new Label(container, SWT.NONE);
			titre.setText("Si vous souhaitez envoyer les cotations pour le numéro de séjour, les cotations des prélèvements suivant seront aussi envoyées :");

			prelevements = PrelevementServiceImpl.getInstance().getPrelevementByNumSejour(prel.getNumSejour());
			for (Prelevement prelevement : prelevements) {
				if (prel.getCotationEnvoye() > 0) {
					Label err = new Label(container, SWT.NONE);
					err.setText(prelevement.getNumeroPrelevement() + " : ce prelèvement a déjà été envoyé à la cotation et possède le même numéro de séjour.\nIl est impossible de coter à nouveau sur ce numéro de séjour" + prel.getNumSejour());
					envoyer = false;
					break;
				}
				Label prele = new Label(container, SWT.NONE);
				prele.setText(prelevement.getNumeroPrelevement() + " " + prelevement.getTypePrelevement().getLibelle());
				List<Analyse> analyses = AnalyseServiceImpl.getInstance().findAllByidPrelevement(prelevement.getIdPrelevement());
				for (Analyse analyse : analyses) {
					Label ana = new Label(container, SWT.NONE);
					if (analyse.getDateTechnique() != null) {
						ana.setText("\tAnalyse : " + analyse.getTypeAnalyse().getLibelle() + " réalisée le " + analyse.getDateTechnique());
					} else {
						ana.setText("\tAnalyse : " + analyse.getTypeAnalyse().getLibelle() + " pas de date de réalisation ");
					}
					List<Resultat> resultats = ResultatServiceImpl.getInstance().findAllByidAnalyse(analyse.getIdAnalyse());
					for (Resultat resulat : resultats) {
						Label res = new Label(container, SWT.NONE);
						if (resulat.getDateRendu() != null) {
							res.setText("\t\tResultat : " + resulat.getResultat() + " signé le " + resulat.getDateRendu());
						} else {
							res.setText("\t\tRésultat : " + resulat.getResultat() + " pas de date de rendu");
						}
					}
				}
			}
			Label titre2 = new Label(container, SWT.NONE);
			titre2.setText("Avant d'envoyer les cotations, êtes-vous certain que tous les résultats pour ces dossiers sont bien envoyés\n et qu'aucune analyse complémentaire n'est à réaliser.");
			Label titre3 = new Label(container, SWT.NONE);
			titre3.setText("Assurez-vous aussi que toutes les cotations ont bien été enregistrées,\nces cotations seront envoyées à la facturation en fin de mois et aucune cotation supplémentaire ne pourra être enregistrée sur ce numéro de séjour.");

		} else {
			List<Prelevement> prelevements = PrelevementServiceImpl.getInstance().getPrelevementByNumSejour(prel.getNumSejour());
			for (Prelevement prelevement : prelevements) {
				if (prel.getCotationEnvoye() > 0) {
					Label err = new Label(container, SWT.NONE);
					err.setText(prelevement.getNumeroPrelevement() + " : ce prelèvement a déjà été envoyé à la cotation et possède le même numéro de séjour.\nIl est impossible de coter à nouveau sur ce numéro de séjour" + prel.getNumSejour());
					envoyer = false;
					break;
				}

			}
		}
		return container;

	}

	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		if (envoyer) {
			createButton(parent, IDialogConstants.OK_ID, "Envoyer", true);
		}
		createButton(parent, IDialogConstants.CANCEL_ID, "Annuler", false);
	}

	@Override
	protected Point getInitialSize() {
		return new Point(800, 500);
	}

	@Override
	protected void okPressed() {
		for (Prelevement prelevement : prelevements) {
			if (prelevement.getCotationEnvoye() == 0) {
				prelevement.setCotationEnvoye(1);
				try {
					PrelevementServiceImpl.getInstance().save(prelevement);
				} catch (HibernateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		super.okPressed();
	}

}